package com.mxj.indexer.model;

import lombok.Data;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Scanner;

/**
 * @author yuisama
 * @date 2023/04/08 17:38
 **/
@Slf4j
@Data
public class Document {
    private String title;//从文件名解析
    private String url; //无法直接从file中拿到.依赖两个额外的信息：
                        //1.https://docs.orcale.com/javase/8/docs/api/
                        //2.相对路径的相对位置
    private String content;//从文件中读取，并进行一定的处理

    //专门给测试用例的构造方法
    public Document(String title,String url,String content){
        this.title = title;
        this.url = url;
        this.content = content;
    }

    public Document(File file,String urlPrefix,File rootFile){
        this.title = parseTitle(file);
        this.url = parseUrl(file,urlPrefix,rootFile);
        this.content = parseContent(file);
        log.debug("构建文档：{}",title);
    }


    @SneakyThrows
    private String parseUrl(File file, String urlPrefix, File rootFile) {
        //1.得到一个相对路径，file相对于rootFile的相对路径
        //比如： rootFile 是 D：\代码保存\搜索引擎\docs\api
        // file是  D：\代码保存\搜索引擎\docs\api\javax\sql\DatSource.html
        //相对路径就是：javax\sql\DatSource.html
        //把所有反斜杠\ 变成正斜杠/
        //最终得到 java/sql/DataSource.html

        String rootPath = rootFile.getCanonicalPath();
        if(!rootPath.endsWith("\\")){
            rootPath = rootPath+ "\\";
        }
        String filePath = file.getCanonicalPath();
        rootPath = rootPath.replace("/","\\");
        String relativePath = filePath.substring(rootPath.length());
        relativePath.replace("\\","/");//将反斜杠转成正斜杠

        return urlPrefix + relativePath;
    }

    private String parseTitle(File file) {
        //从文件名中解析，将.html后缀名去掉，剩余的看作文件标题
        String name = file.getName();
        String suffix = ".html";
        return name.substring(0,name.length() - suffix.length());
    }

    @SneakyThrows
    private String parseContent(File file) {
        StringBuilder contentBuilder = new StringBuilder();
        // 假定文件一定是存在的
        try (InputStream is = new FileInputStream(file)) {
            // 这些文档的字符是 ISO-8859-1，这个是明确告诉大家的，不是一个知识点
            try (Scanner scanner = new Scanner(is, "ISO-8859-1")) {
                while (scanner.hasNextLine()) {
                    String line = scanner.nextLine();

                    // 首先去掉 <script ...>...</script>
                    line = line.replaceAll("<script[^>]*>[^<]*</script>", " ");
                    // 去掉标签
                    line = line.replaceAll("<[^>]*>", " ");
                    // 多带的空格的意思是，把 换行符 也视为空格了
                    contentBuilder.append(line).append(" ");
                }
            }
        }
        String res = contentBuilder.toString().replaceAll("\\s+", " ").trim();
        // 把最后多出来的空格删除掉
        return res;
    }
}

